#include "commands.h"

//  ​**​*​**​*​**​*​**​*​**​*​**​*​**​*​**​*​**​*​**​*​**​*​**​*​**​*​**​*​**​*​**​*​**​*​**​*​**​*​**​
//  * 命令解析模块 - 将用户输入转换为结构化命令
//  * 功能：
//  * 1. 分离命令和参数
//  * 2. 验证命令有效性
//  * 3. 统一错误格式
//  ​**​*​**​*​**​*​**​*​**​*​**​*​**​*​**​*​**​*​**​*​**​*​**​*​**​*​**​*​**​*​**​*​**​*​**​*​**​*​**​
//  * 输入示例：
//  *   "ls -l /tmp" -> cmd=CMD_LS_REQ, args="-l /tmp"
//  *   "exit"       -> 返回1 */
int parse_input(const char *input, ParsedCommand *out)
{
    // 验证输入的有效性
    if (input == NULL || out == NULL)
    {
        return -1;
    }
    char cmd[16] = {0};
    out->has_args = 0; // 默认无参数

    // 安全分割命令和参数（防止缓冲区溢出）
    if (sscanf(input, "%15s %255[^\n]", cmd, out->args) >= 1)
    {
        out->has_args = (strlen(out->args) > 0);
    }

    // 命令匹配（可扩展）
    if (strcmp(cmd, "ls") == 0)
        out->cmd = CMD_LS_REQ;
    else if (strcmp(cmd, "cd") == 0)
        out->cmd = CMD_CD_REQ;
    else if (strcmp(cmd, "pwd") == 0)
        out->cmd = CMD_PWD_REQ;
    // ...其他命令...
    else if (strcmp(cmd, "exit") == 0 || strcmp(cmd, "quit") == 0)
        return 1; // 特殊返回码表示退出
    else
        return -1; // 未知命令

    return 0;
}

//  ​**​*​**​*​**​*​**​*​**​*​**​*​**​*​**​*​**​*​**​*​**​*​**​*​**​*​**​*​**​*​**​*​**​*​**​*​**​*​**​
//  处理具体命令的响应
//  每个处理函数只负责一种响应类型
//  ​**​*​**​*​**​*​**​*​**​*​**​*​**​*​**​*​**​*​**​*​**​*​**​*​**​*​**​*​**​*​**​*​**​*​**​*​**​*​**​

/* 处理LS命令响应（目录列表）
 * 假设数据格式：
 *   ID  Name    Size    Modified       Type
 *   1   test.c  1024    2023-01-01     File */
int handle_ls_response(ClientContext *ctx, const protocol_header_t *header,
                       const char *data)
{
    // 显示当前目录（从上下文缓存中获取）
    printf("当前目录: %s\n", ctx->current_dir);

    // 表头格式化输出
    printf("%-8s%-20s%-10s%-16s%s\n",
           "ID", "Name", "Size", "Modified", "Type");

    // 实际数据输出（这里简单打印，实际应解析结构化数据）
    puts(data);
    return 0;
}

/* 处理PWD命令响应（当前路径） */
int handle_pwd_response(ClientContext *ctx, const protocol_header_t *header,
                        const char *data)
{
    if (header->data_length > 0)
    {
        // 安全拷贝目录路径（防止溢出）                    
        strncpy(ctx->current_dir, data, sizeof(ctx->current_dir) - 1);
        ctx->current_dir[sizeof(ctx->current_dir) - 1] = '\0';

        printf("当前目录: %s\n", ctx->current_dir);
    }
    return 0;
}